package cluedo;

import java.awt.Image;
import java.io.Serializable;
import java.net.URL;

import javax.swing.ImageIcon;

/** Pedina usata da un giocatore */
public class Pawn implements Serializable {

	private static final long serialVersionUID = -2723663008930767031L;
	
	/**
	 * Il nome del personaggio associato alla pedina
	 */
	private String name;
	
	/**
	 * il colore della pedina
	 */
	private ColorPawn color;
	
	
	/**
	 * Il nome della stanza in cui e' la pedina
	 */
	private String roomName=null;
	
	/**
	 * L'immagine del personaggio associato alla pedina
	 */
	private URL image;
	
	/**
	 * L'immagine della pedina
	 */
	private ImageIcon imagePawn;
	
	/**Indica se la pedina del giocatore e' in una stanza*/
	private boolean isInRoom=false; 
	
	/**
	 * Costruttore della pedina
	 * @param colorePedina il colore da associare alla pedina
	 */
	public Pawn(ColorPawn colPawn){
	
		setColor(colPawn);
	}
	
	
	/**
	 * Restituisce il nome della stanza in cui e' la pedina o null se non e' in nessuna stanza
	 * @return vedi descrizione
	 */
	public String getRoomName(){
		
		return this.roomName;
		
	}
	
	/**
	 * imposta il nome della stanza in cui e' la pedina
	 * @param roomName il nome della stanza o null se la pedina non e' in una stanza
	 */
	public void setRoomName(String roomName){
		
		if(roomName==null || Room.rooms.containsKey(roomName))
			this.roomName=roomName;
		else
			System.err.println("Pawn: Il nome della stanza inserita non e' valido");
		
	}
	
	/** Ritorna il nome del personaggio associato alla pedina
	 * @return vedi descrizione 
	 */
	public String getName(){
		
		return this.name;
	}
	
	/** Ritorna il colore della pedina 
	 * @return vedi descrizione 
	 */
	public ColorPawn getColor(){
		
		return this.color;
	}
	
	
	/**
	 * Controlla se la pedina di un giocatore e' in una stanza
	 * @return true se la pedina e' in una stanza e false altrimenti
	 */
	public boolean isInRoom(){
		
		return this.isInRoom;
		
	}
	
	/**
	 * Imposta la pedina all'interno di una stanza oppure no
	 * @param b true se la pedina e' in una stanza, false altrimenti
	 */
	public void setIsInRoom(boolean b){
		
		this.isInRoom=b;
		
	}
	
	
	/**
	 * Ottieni l'immagine associata alla pedina scalata come specificato nei paramteri h e w
	 * se uno dei due parametri e' -1 l'immagine viene scalata in proporzione all'altro parametro specificato
	 * @param w larghezza dell'immagine
	 * @param h altezza dell'immagine
	 * @return vedi descrizione
	 */
	public ImageIcon getScaledImage(int w, int h){
		Image tmpImg= imagePawn.getImage();
		tmpImg= tmpImg.getScaledInstance(w, h, Image.SCALE_SMOOTH);
		return new ImageIcon(tmpImg);
	}
	
	
	/**
	 * Imposta il colore e l'immagine della pedina oltre al nome e l'immagine del personaggio associato
	 * @param colPawn il colore da impostare
	 */
	public void setColor(ColorPawn colPawn){
		
				switch(colPawn){
					case RED:
						color=ColorPawn.RED;
						name="Miss Scarlett";
						image= getClass().getResource("/img/scarlett.jpg");
						imagePawn = new ImageIcon(Pawn.class.getResource("/img/scarlettpawn.png")); 
						break;
					case MAGENTA:
						color=ColorPawn.MAGENTA;
						name="Professor Plum";
						image= getClass().getResource("/img/plum.jpg");
						imagePawn = new ImageIcon(Pawn.class.getResource("/img/plumpawn.png"));
						break;
					case YELLOW:
						color=ColorPawn.YELLOW;
						name="Colonel Mustard";
						image= getClass().getResource("/img/mustard.jpg");
						imagePawn = new ImageIcon(Pawn.class.getResource("/img/mustardpawn.png"));
						break;
					case GREEN:
						color=ColorPawn.GREEN;
						name="Rev. Green";
						image= getClass().getResource("/img/green.jpg");
						imagePawn = new ImageIcon(Pawn.class.getResource("/img/greenpawn.png"));
						break;
					case WHITE:
						color=ColorPawn.WHITE;
						name="Mrs White";
						image= getClass().getResource("/img/white.jpg");
						imagePawn = new ImageIcon(Pawn.class.getResource("/img/whitepawn.png"));
						break;
					case BLUE:
						color=ColorPawn.BLUE;
						name="Mrs Peacock";
						image= getClass().getResource("/img/peacock.jpg");
						imagePawn = new ImageIcon(Pawn.class.getResource("/img/peacockpawn.png"));
						break;
					default: 
						color=null;
						name="Invalid";
						image= null;
						imagePawn=null;
						System.err.println("Pawn: Il colore della pedina non e' valido");
				}
	}
	
	/**
	 * Restituisce l'immagine del personaggio associato a questa pedina
	 * @return l'immagine
	 */
	public ImageIcon getImage() {
		return new ImageIcon(image);
	}
	
	
	@Override
	public boolean equals(Object pawn2) {
		
		Pawn tmpPawn=(Pawn) pawn2;
		
		if (this.color==(tmpPawn.getColor()))
			return true;
		else return false;
	
	}
	
	
}
